package sde.actor.csm;
import java.io.*;
import java.util.*;

public class OsservatoreSistema extends OsservatoreStazione{
	
	//Le statistiche che si valutano sono presenze, soggiorno e produttivita
	
	//arrivo clienti in coda
	private LinkedList<Integer> arriviId=new LinkedList<Integer>(); 
	private LinkedList<Double> arrivi=new LinkedList<Double>();
	
	public OsservatoreSistema( double tEnd, String nomeFile ){
		super( tEnd, nomeFile );
	}
	
	public void arrivo( Cliente c ){
		arrivi.addLast( c.getTimestamp() );  
		presenze.aggiornamento( arrivi.size(), c.getTimestamp() );
	}//arrivo
	
	public void partenza( Cliente c ){
		//cerca arrivo del cliente in arrivi
		int idc=c.getId();
		int i=arriviId.indexOf( idc );
		if( i!=-1 ){ //esiste arrivo corrispondente, cioe' non si e' al bootstrap
			double tempo = c.getTimestamp();
			double tempoRisposta = tempo - arrivi.get(i);
			totaleTempiRisposta += tempoRisposta;
			arrivi.remove( i );
			//soggiorno.aggiornamento( tempoRisposta, tempo );
		    presenze.aggiornamento( arrivi.size(), tempo );
			numeroServizi++;
            //produttivita.aggiornamento( numeroServizi, tempo );
		}
	}//partenza
	
	public void uscitaCoda( Cliente c ){
		throw new UnsupportedOperationException();
	}//uscitaCoda
	
	public void salva() throws IOException{
		PrintWriter pw = new PrintWriter( new FileWriter(nomeFile) );
		pw.println("N[T]");
		pw.println("X[T]");
		pw.println("Tempo Risposta[T]");
		pw.println("Produttivit�[T]");
		pw.println( String.format("%10.2f", presenze.mediaTemporale()) ) ;
		pw.println( String.format("%10d", numeroServizi) );
		pw.println( String.format("%10.2f",(totaleTempiRisposta/numeroServizi)) );
		pw.println( String.format("%10.2f",(numeroServizi/tEnd)) );
		pw.close();	
	}//salva
	
}//OsservatoreSistema

